#encoding=utf-8

import requests
from lxml import etree

"""
在考虑对html文档处理时,之前考虑的方式是正则,现在考虑另一种方式:XPath来读取文档内容
若采用XPath对XML文档中的元素和属性遍历,XPath使用路径表达式来选区XML文档中的节点或者节点集,这些路径表达式与电脑文件系统中看到的表达式非常相似(或者类似html选择器).具体语法看SpiderBook.pdf或百度：http://lxml.de/index.html

而要想使用XPath语法,则需要在python抓取时先转换成xml,因此使用lxml库,在生成时可以直接赋值,也可从文件中解析读取生成xml

lxml是一个HTML/XML的解析器,主要功能是如何解析和提取HTML/xml数据
lxml与正则一样,也是用C实现的,因此非常高效

lxml会自动修正html代码,如补全标签等

注: xpath返回的都是一个列表!!!
注: 本代码在python2执行,python3应该需要注意编码问题!!!

ps: 感觉如果需要爬取一个页面中的多个标签
"""

class TiebaSpider(object):
    def __init__(self):
        self.base_url = "https://tieba.baidu.com/"
        self.headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}

        pass

    def send_request(self, url):
        print("[INFO]正在发送请求: {}".format(url))
        response = requests.request("get", url, headers=self.headers)
        return response

    def parse_page(self, response):
        """获取帖子的链接列表"""
        html = response.content
        #print(html)
        #利用etree.HTML,将字符串解析为HTML文档,构建xml对象
        html_obj = etree.HTML(html)
        #获取每个贴子的链接
        page_link_list = html_obj.xpath('//a[@class="j_th_tit "]/@href')
        #print(page_link_list)
        return page_link_list

    def parse_img(self, response):
        """获取贴子中图片链接列表"""
        html = response.content
        html_obj = etree.HTML(html)
        img_link_list = html_obj.xpath('//img[@class="BDE_Image"]/@src')
        return img_link_list

    def save_content(self, response, filename):
        """保存"""
        print("[INFO]正在保存图片: {}".format(filename))
        with open("./tieba/" + filename, "w") as f:
            f.write(response.content)
        pass

    def main(self):
        #这里也许可以加个每页条数参数 pn ,那么就搞成个字典,利用urlencode转为字符串就好,反正我的网页没有这个参数(但是好像能访问),当然可以利用这个参数搞个起始页和终止页
        page_url = self.base_url + "f?&kw="+raw_input("请输入要查找的贴吧名: ")
        response = self.send_request(page_url)
        page_link_list = self.parse_page(response)
        for link in page_link_list:
            #if raw_input("按q停止爬取:")=="q":
            #    return
            page_url = self.base_url + link
            page_response = self.send_request(page_url)
            img_link_list = self.parse_img(page_response)
            for img_link in img_link_list:
                img_response = self.send_request(img_link)
                #一般图片的名字都是唯一不重复的,而图片链接中后16位是加密算法得来,基本上不重复,所以以此命名
                self.save_content(img_response, img_link[-15:])
        
        #self.save_content()


if __name__ == "__main__":
    tieba = TiebaSpider()
    tieba.main()
